/*! *********************************************************************************
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* \file
*
* SPDX-License-Identifier: BSD-3-Clause
********************************************************************************** */

#ifndef __UART_ADAPTER_H__
#define __UART_ADAPTER_H__

#include "stm32f4xx.h"
#include "stm32_common.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
#include "fsl_os_abstraction.h"




/*! *********************************************************************************
*************************************************************************************
* Public macros
*************************************************************************************
********************************************************************************** */
#ifndef gUartIsrPrio_c
#define gUartIsrPrio_c      (0x40)
#endif


#define FSL_FEATURE_SOC_LPUART_COUNT

/*! *********************************************************************************
*************************************************************************************
* Public type definitions
*************************************************************************************
********************************************************************************** */
typedef struct uartState_tag uartState_t;  /* 此结构体管理了SerialManager的子类LPUART数据收发的所有功能 */

/* 形参state的成员中已经包含了回调函数，将其自身做形参传递给回调函数，体现了“对象”的思想 */
typedef void (*uartCallback_t)(uartState_t* state);  

/* 
 * 此结构体类型变量在函数Serial_InitInterface(...)中初始化 
 * 串口外设一级封装：pLpuartStates[FSL_FEATURE_SOC_LPUART_COUNT]
 *
 * 程序员关心的串行通信外设：发送容器
 *                       接收容器
 *                       数据发送完毕后如何通知上层代码
 *                       数据接收完毕后如何通知上层代码
 *                       
 * PPPState_t类型变量才是外设管理的核心数据                      
 * 
 */
struct uartState_tag {
    uartCallback_t txCb;    /* 指向函数Serial_UartTxCb(...) */
    uartCallback_t rxCb;    /* 指向函数Serial_UartRxCb(...) */
    uint32_t txCbParam;     /* 这些回调函数参数具体是什么？？？ */
    uint32_t rxCbParam;
    uint8_t *pTxData;       /* 此成员在调用LPUART_SendData(...)时才被赋值！！！ */
    uint8_t *pRxData;       /* “pRxData”在函数Serial_InitInterface(...)中初始化，使其指向mSerials[i].rxBuffer */
    volatile uint32_t txSize;
    volatile uint32_t rxSize;
};

enum uartStatus_tag {
    gUartSuccess_c,
    gUartInvalidParameter_c,
    gUartBusy_c
};


typedef USART_InitTypeDef UsartCfg_t;

/*! *********************************************************************************
*************************************************************************************
* Public functions
*************************************************************************************
********************************************************************************** */



/* USART */

uint32_t st_USART_Initialize(uint32_t instance, uartState_t *pState);
uint32_t st_USART_ReInit(uint32_t instance);
uint32_t st_USART_SetBaudrate(uint32_t instance, uint32_t baudrate);
uint32_t st_USART_SendData(uint32_t instance, uint8_t* pData, uint32_t size);
uint32_t st_USART_ReceiveData(uint32_t instance, uint8_t* pData, uint32_t size);
uint32_t st_USART_InstallRxCalback(uint32_t instance, uartCallback_t cb, uint32_t cbParam);
uint32_t st_USART_InstallTxCalback(uint32_t instance, uartCallback_t cb, uint32_t cbParam);
uint32_t st_USART_IsTxActive(uint32_t instance);


#endif /* __UART_ADAPTER_H__ */
